﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositories;
using DAL.AbstractRepositories;

namespace DAL.Repositorios
{
    public class TelefonoReferenciaRepository : DAL.AbstractRepositories.AbstractRepository<Telefono>
    {


        public override void Insert(Telefono entity)
        {
            Inserted.Add(entity);
        }

        public override void Delete(Telefono entity)
        {
            Deleted.Add(entity);
        }

        public override void Update(Telefono entity)
        {
            Updated.Add(entity);
        }

        public override IEnumerable<Telefono> GetAll()
        {
            
           
            DataSet ds = GetDataset(DBNull.Value, DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                yield return crearTelefono(Convert.ToInt32(dr["IdTelefono"]), dr);
        }

        public override Telefono GetById(int id)
        {

            DataSet ds = GetDataset(id, DBNull.Value);
            Telefono telefono = null;
            foreach (DataRow dr in ds.Tables[0].Rows)
                telefono = crearTelefono(id, dr);
               
            

            return telefono;
        }

        protected override void InsertEntity(Telefono t) {

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@NumeroTelefono",t.NumeroTelefono));
                cmd.Parameters.Add(new SqlParameter("@DescTipoTelefono",t.Tipo));
                cmd.Parameters.Add(new SqlParameter("@IdReferencia", t.IdEntidadRelacionada));

                DBAccess.ExecuteSPNonQuery(ref cmd, "PaRegistrarTelReferencia");
          
            
        }

        protected override void UpdateEntity(Telefono t) {

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdTelefono", t.Id));
                cmd.Parameters.Add(new SqlParameter("@NumeroTelefono", t.NumeroTelefono));
                cmd.Parameters.Add(new SqlParameter("@DescTipoTelefono", t.Tipo));
                cmd.Parameters.Add(new SqlParameter("@IdReferencia", t.IdEntidadRelacionada));

                DBAccess.ExecuteSPNonQuery(ref cmd, "PaModificarTelReferencia");
            
        }

        protected override void DeleteEntity(Telefono t) {
                
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@IdTelefono", t.Id));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaEliminarTelReferencia");
        }

        internal static IList<Telefono> telefonosDeReferencia(int idReferencia){


            IList<Telefono> listaTelefono = new List<Telefono>();

            DataSet ds = GetDataset(DBNull.Value, idReferencia);

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                Telefono t = crearTelefono(Convert.ToInt32(dr["IdTelefono"]), dr);
               listaTelefono.Add(t);                
            }

            return listaTelefono.Count>0? listaTelefono : null;
        }

        public static Telefono crearTelefono(int id , DataRow dr) {

            return new Telefono(
                idTelefono: id,
                tipo: dr["DescTipoTelefono"].ToString(),
                idEntidadRelacionada: Convert.ToInt32(dr["IdReferencia"]),
                numeroTelefono: dr["NumeroTelefono"].ToString()
            );
        }

        private static DataSet GetDataset(object idTel, object idRef){

            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@IdTelefono", idTel));
            cmd.Parameters.Add(new SqlParameter("@IdReferencia", idRef));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaConsultarTelRefGeneral");

            return ds;
        }
    }
}
